package com.locus.locus.client.widgets;

import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Widget;
import com.locus.locus.client.ServidorAsync;
import com.locus.locus.client.dados.ConfiguracaoBoxWrapper;
import com.locus.locus.client.dados.ConfiguracaoConjuntoBoxesWrapper;

public class WidgetConjuntoBoxes extends Composite {

	public class DeletarHandler implements ClickHandler {
		private final ConfiguracaoBoxWrapper box;

		public DeletarHandler(ConfiguracaoBoxWrapper box) {
			this.box = box;
		}

		@Override
		public void onClick(ClickEvent event) {
			servidor.excluirBoxConjuntoConfiguracao(box, callbackExcluir);
		}
	}

	private static WidgetConjuntoBoxesUiBinder uiBinder = GWT
			.create(WidgetConjuntoBoxesUiBinder.class);

	interface WidgetConjuntoBoxesUiBinder extends UiBinder<Widget, WidgetConjuntoBoxes> {
	}
	
	@UiField
	ListBox listaBoxes;
	@UiField
	Button btAdicionar;
	@UiField
	FlexTable tabelaBoxes;

	private final ServidorAsync servidor;
	private List<ConfiguracaoBoxWrapper> conjuntoBoxes;
	
	@UiHandler("btAdicionar")
	void adicionarBox(ClickEvent e) {
		this.btAdicionar.setEnabled(false);
		
		final int linhaSelecionada = this.listaBoxes.getSelectedIndex();
		final ConfiguracaoBoxWrapper boxSelecionado = this.conjuntoBoxes.get(linhaSelecionada);
				
		this.servidor.inserirBoxConjuntoConfiguracao(boxSelecionado, this.callbackInserir);
	}
	
	public AsyncCallback<Void> callbackInserir = new AsyncCallback<Void>() {
		@Override
		public void onSuccess(Void result) {
			servidor.buscarConfiguracaoConjuntoBoxes(callbackConjunto);
		}
		
		@Override
		public void onFailure(Throwable caught) {
			btAdicionar.setEnabled(true);
			Window.alert("falha em inserir");
		}
	};
	
	public AsyncCallback<Void> callbackExcluir = new AsyncCallback<Void>() {
		@Override
		public void onSuccess(Void result) {
			servidor.buscarConfiguracaoConjuntoBoxes(callbackConjunto);
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em excluir");
		}
	};
	
	private final AsyncCallback<ConfiguracaoConjuntoBoxesWrapper> callbackConjunto = new AsyncCallback<ConfiguracaoConjuntoBoxesWrapper>() {
		@Override
		public void onSuccess(ConfiguracaoConjuntoBoxesWrapper boxesWrapper) {
			final List<ConfiguracaoBoxWrapper> configuracoes = boxesWrapper.getBoxes();
			ConfiguracaoBoxWrapper wrapper;
			Button btDeletar;
			
			tabelaBoxes.removeAllRows();
			
			tabelaBoxes.setText(0, 0, "nome box");
			for(int i = 0; i < configuracoes.size(); i++){
				wrapper = configuracoes.get(i);
				btDeletar = new Button("deletar");
				btDeletar.addClickHandler(new DeletarHandler(wrapper));
				
				tabelaBoxes.setText(i + 1, 0, wrapper.getNomeBox());
				tabelaBoxes.setWidget(i + 1, 1, btDeletar);				
			}
			btAdicionar.setEnabled(configuracoes.size() < 6);
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em buscar conjunto de boxes");
		}
	};

	private AsyncCallback<List<ConfiguracaoBoxWrapper>> callbackBoxes = new AsyncCallback<List<ConfiguracaoBoxWrapper>>() {
		@Override
		public void onSuccess(List<ConfiguracaoBoxWrapper> boxesWrapper) {
			conjuntoBoxes = boxesWrapper;
			
			for(ConfiguracaoBoxWrapper box:boxesWrapper){
				listaBoxes.addItem(box.getNomeBox());
			}
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em buscar lista de boxes");
		}
	};

	public WidgetConjuntoBoxes(ServidorAsync servidor) {
		initWidget(uiBinder.createAndBindUi(this));
		btAdicionar.setEnabled(false);
		this.servidor = servidor;
		this.servidor.buscarConfiguracoesBoxes(this.callbackBoxes);
		this.servidor.buscarConfiguracaoConjuntoBoxes(this.callbackConjunto);
	}
}
